from __future__ import annotations

import os

from flask_restx import Namespace, Resource, fields
from flask_jwt_extended import jwt_required, get_jwt_identity

from ..models import User
from ..utils import require_role

ns = Namespace("demo", description="演示与调试接口")

ping_model = ns.model(
    "PingResponse",  # ping 接口响应模型
    {
        "message": fields.String(description="固定返回 pong"),
        "environment": fields.String(description="当前运行环境"),
    },
)

secure_model = ns.model(
    "SecureInfo",  # 需要权限的示例响应模型
    {
        "user_id": fields.Integer(description="当前用户 ID"),
        "email": fields.String(description="当前用户邮箱"),
        "roles": fields.List(fields.String, description="当前用户拥有的角色"),
    },
)


# /**
#  * 作者: "test_LH"
#  * 日期: 2025-10-11
#  * 名称: Ping
#  * 作用: 提供无需鉴权的存活检测接口
#  * 参数:
#  *   @param 无 类实例化由 Flask-RESTX 管理
#  * 返回: 无
#  * 备注: 用于环境验证
#  */
@ns.route("/ping")
class Ping(Resource):
    # /**
    #  * 作者: "test_LH"
    #  * 日期: 2025-10-11
    #  * 名称: get
    #  * 作用: 返回 pong 信息和当前环境标识
    #  * 参数:
    #  *   @param self 当前资源实例
    #  * 返回: 包含 message 与 environment 的字典
    #  * 备注: 无
    #  */
    @ns.marshal_with(ping_model)
    def get(self):
        env_name = os.getenv("FLASK_ENV") or os.getenv("ENVIRONMENT") or "unknown"
        return {"message": "pong", "environment": env_name}


# /**
#  * 作者: "test_LH"
#  * 日期: 2025-10-11
#  * 名称: SecureInfo
#  * 作用: 提供需要管理员角色的示例接口
#  * 参数:
#  *   @param 无 类实例化由 Flask-RESTX 管理
#  * 返回: 无
#  * 备注: 需具备 admin 角色
#  */
@ns.route("/secure-info")
class SecureInfo(Resource):
    # /**
    #  * 作者: "test_LH"
    #  * 日期: 2025-10-11
    #  * 名称: get
    #  * 作用: 返回当前管理员用户的详细信息
    #  * 参数:
    #  *   @param self 当前资源实例
    #  * 返回: 包含用户标识和角色列表的字典
    #  * 备注: 用户不存在时返回 404
    #  */
    @jwt_required()
    @ns.marshal_with(secure_model)
    def get(self):
        require_role(ns, "admin")
        user = User.query.get_or_404(int(get_jwt_identity()), description="用户不存在")
        return {
            "user_id": user.id,
            "email": user.email,
            "roles": [role.name for role in user.roles],
        }
